package com.adee.netty.bytebuf;

import io.netty.channel.AdaptiveRecvByteBufAllocator;
import io.netty.channel.RecvByteBufAllocator;

/**
 * AdaptiveRecvByteBufAllocator是我们实际使用的缓冲管理区，这个类可以动态计算下次需要
 * 分配的内存大小，其根据读取到的数据预测所需字节大小，从而自动增加或减少；如果上一次读循环
 * 将缓冲填充满，那么预测的字节数会变大。如果连续两次读循环不能填满已分配的缓冲区，则会减少
 * 所需的缓冲大小。需要注意的是，这个类只是计算大小，真正的分配动作由ByteBufAllocator完成。
 *
 */
public class AdaptiveRecvByteBufAllocatorTest {
    public static void main(String[] args) {

        // 默认最小64 初始1024 最大65536
        AdaptiveRecvByteBufAllocator adAlloctor = new AdaptiveRecvByteBufAllocator();
        RecvByteBufAllocator.Handle handle =  adAlloctor.newHandle();

        System.out.println("------------读循环1----------------------------");
        handle.reset(null);// 读取循环开始前先重置，将读取的次数和字节数设置为0
        System.out.println(String.format("读循环1-1：需要分配的大小：%d", handle.guess()));
        handle.lastBytesRead(1024);
        System.out.println(String.format("读循环1-2：需要分配的大小：%d", handle.guess()));// 读循环中缓冲大小不变
        handle.lastBytesRead(1024);

        handle.readComplete();
        System.out.println("------------读循环2----------------------------");
        handle.reset(null);// 读取循环开始前先重置，将读取的次数和字节数设置为0
        System.out.println(String.format("读循环2-1：需要分配的大小：%d", handle.guess()));
        handle.lastBytesRead(1024);

        handle.readComplete();
        System.out.println("------------读循环3----------------------------");
        handle.reset(null);// 读取循环开始前先重置，将读取的次数和字节数设置为0
        System.out.println(String.format("读循环3-1：需要分配的大小：%d", handle.guess()));
        handle.lastBytesRead(1024);

        handle.readComplete();
        System.out.println("------------读循环4----------------------------");
        handle.reset(null);// 读取循环开始前先重置，将读取的次数和字节数设置为0
        System.out.println(String.format("读循环4-1：需要分配的大小：%d", handle.guess()));
        handle.readComplete();

        //###############################
        //------------读循环1----------------------------
        //读循环1-1：需要分配的大小：1024
        //读循环1-2：需要分配的大小：1024
        //------------读循环2----------------------------
        //读循环2-1：需要分配的大小：16384 （1024 × 2^INDEX_INCREMENT）
        //------------读循环3----------------------------
        //读循环3-1：需要分配的大小：16384
        //------------读循环4----------------------------
        //读循环4-1：需要分配的大小：8192  （16384 /  2^INDEX_DECREMENT）
    }
}
